import BaseController from "../../base/baseController.js";
import ShopCartNavigationController from "./shopCartNavitationContraller.js";
import ShopCartItemController from "./shopCartItemController.js";
import ShopCartPayController from "./shopCartPayController.js";

/**
 * @description 购物车控制器
 * @class {ShopCartController}
 * @extends {BaseController} 基础控制器
 * @author hhx
 * @date 2024-12-2 11:12
 * @version 0.1.2
 */
export default class ShopCartController extends BaseController {


    /**
     * @description 购物车支付控制器
     * @private
     * @type {ShopCartPayController}
     */
    _shopCartPayController = null;

    /**
     * @description 购物车导航控制器
     * @private
     * @type {ShopCartNavigationController}
     */
    _shopCartNavigationController = null;

    /**
     * @description 购物车列表控制器
     * @private
     * @type {ShopCartItemController}
     */
    _shopCartItemController = null;

    /**
     * @description 购物车控制器
     * @public
     * @constructor
     * @param props {Object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 购物车控制器
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ShopCartController|*} 商品列表
     */
    static instance(props = {}) {
        const instance = new ShopCartController(props);
        instance.init(props);
        return instance;
    }

    //=========================== 内部成员 ===============================

    /**
     * @description 获取 购物车导航控制器
     * @member
     * @protected
     * @return {ShopCartNavigationController} 购物车导航控制器
     */
    get shopCartNavigationController() {
        return this._shopCartNavigationController;
    }

    /**
     * @description 设置 购物车导航控制器
     * @member
     * @protected
     * @param value {ShopCartNavigationController} 购物车导航跟控制器
     */
    set shopCartNavigationController(value) {
        this._shopCartNavigationController = value;
    }


    /**
     * @description 获取 购物车列表控制器
     * @member
     * @protected
     * @return {ShopCartItemController} 购物车列表控制器
     */
    get shopCartItemController() {
        return this._shopCartItemController;
    }

    /**
     * @description 获取 购物车列表控制器
     * @member
     * @protected
     * @param value {ShopCartItemController} 购物车列表控制器
     */
    set shopCartItemController(value) {
        this._shopCartItemController = value;
    }


    /**
     * @description 获取 购物车支付控制器
     * @member
     * @protected
     * @return {ShopCartPayController} 购物车支付控制器
     */
    get shopCartPayController() {
        return this._shopCartPayController;
    }

    /**
     * @description 设置 购物车支付控制器
     * @member
     * @protected
     * @param value {ShopCartPayController} 购物车支付控制器
     */
    set shopCartPayController(value) {
        this._shopCartPayController = value;
    }


    //=========================== 成员方法 ===============================

    /**
     * @description 获取商品导航控制器
     * @public
     * @return {ShopCartNavigationController} 商品导航控制器
     */
    getShopCartNavigationController() {
        return this.shopCartNavigationController;
    }

    /**
     * @description 设置 商品导航控制器
     * @public
     * @param value {ShopCartNavigationController} 设置商品导航控制器
     */
    setShopCartNavigationController(value) {
        this.shopCartNavigationController = value;
    }

    /**
     * @description 判断商品导航控制器是否存在
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasShopCartNavigationController() {
        return this.isNotNull(this.shopCartNavigationController);
    }


    /**
     * @description 获取 商品列表控制器
     * @public
     * @return {ShopCartItemController} 商品列表控制器
     */
    getShopCartItemController() {
        return this.shopCartItemController;
    }

    /**
     * @description 设置 商品列表控制器
     * @public
     * @param value {ShopCartItemController} 商品列表控制器
     */
    setShopCartItemController(value) {
        this.shopCartItemController = value;
    }

    /**
     * @description 判断商品列表控制器是否存在
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasShopCartItemController() {
        return this.isNotNull(this.shopCartItemController);
    }

    /**
     * @description 获取 商品支付控制器
     * @public
     * @return {ShopCartPayController} 商品支付制器
     */
    getShopCartPayController() {
        return this.shopCartPayController;
    }

    /**
     * @description 设置 商品支付控制器
     * @public
     * @param value {ShopCartPayController} 商品支付控制器
     */
    setShopCartPayController(value) {
        this.shopCartPayController = value;
    }

    /**
     * @description 判断商品支付控制器是否存在
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasShopCartPayController() {
        return this.isNotNull(this.shopCartPayController);
    }

    //=========================== 基础属性 ===============================

    //=========================== 属性方法 ===============================

    //=========================== 接口方法 ===============================

    /**
     * @description 添加商品到购物车
     * @public
     * @param product {ProductModel} 商品模型对象
     */
    addProductToShop(product) {
        this.shopCartItemController.addProductToShop(product);
    }

    /**
     * @description 获取购物车店铺列表
     * @public
     * @return {Array} 店铺商品列表
     */
    getProductToShop() {
        return this.shopCartItemController.getProductToShop();
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建购物车导航控制器
     * @protected
     * @returns {ShopCartNavigationController|*} 购物车导航控制器
     */
    createShopCartNavigationController() {
        return ShopCartNavigationController.instance();
    }

    /**
     * @description 创建购物车列表控制器
     * @protected
     * @returns {ShopCartItemController|*} 购物车列表控制器
     */
    createShopCartItemController() {
        return ShopCartItemController.instance();
    }

    /**
     * @description 创建购物车支付控制器
     * @protected
     * @returns {ShopCartPayController|*} 购物车支付控制器
     */
    createShopCartPayController() {
        return ShopCartPayController.instance();
    }

    //=========================== 构建方法 ===============================

    //=========================== 重载方法 ===============================

    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {

        super.init(props);

        //初始化购物车导航栏控制器
        this.initShopCartNavigationController();

        //初始化购物车列表控制器
        this.initShopCartItemController();

        //初始化购物车支付控制器
        this.initShopCartPayController();

    }

    //=========================== 内部方法 ===============================

    /**
     * @description 初始化购物车导航控制器
     * @protected
     */
    initShopCartNavigationController() {
        let shopCartNavigationController = this.createShopCartNavigationController();
        this.setShopCartNavigationController(shopCartNavigationController);
    }

    /**
     * @description 初始化购物车列表控制器
     * @protected
     */
    initShopCartItemController() {
        let createShopCartItemController = this.createShopCartItemController();
        this.setShopCartItemController(createShopCartItemController);
    }

    /**
     * @description 初始化购物车支付控制器
     * @protected
     */
    initShopCartPayController() {
        let shopCartPayController = this.createShopCartPayController();
        this.setShopCartPayController(shopCartPayController);
    }

    //=========================== 控制方法 ===============================

    //=========================== 事件订阅 ===============================

    //=========================== 事件触发 ===============================

    //=========================== 处理函数 ===============================
}

